iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0

首先 先開啟產品頁面
咒語:將每個商品加上加入購物車內容 並且把title 跟price 使用一個購物車物件存起來以備之後購物車頁面查看

 (
    <RootContainer>
      <ParallaxContainer>
        <ParallaxContent>
          <Typography variant="h4" component="h1" color="primary">
            歡迎來到我們的網站
          </Typography>
          <Typography variant="h6" color="primary">
            探索最新的商品
          </Typography>
        </ParallaxContent>
      </ParallaxContainer>
      <ProductGrid>
        {products.map((product, index) => (
          <Grid item xs={12} sm={6} md={4} lg={4} key={index}>
            <ProductItem>
              <img src={product.image} alt={product.title} />
              <Typography variant="h6">{product.title}</Typography>
              <Typography variant="body1" color="textSecondary">
                價格: {product.price}
              </Typography>
              <Button
                variant="contained"
                color="primary"
                onClick={() => addToCart(product)}
                sx={{ marginTop: "10px" }} // 使用 sx 設置樣式
              >
                加入購物車
              </Button>
            </ProductItem>
          </Grid>
        ))}
      </ProductGrid>
    </RootContainer>
  );

咒語:把 const [cart, setCart] = useState([]); 拉到app層 並且用useContext 傳遞資料

解析 就會把app建立一個Context 給全域使用 ,其中能用的參數為 value={{ cart, setCart, token, setToken }}

export const AllContext = createContext (null);
function App() {
  const [token, setToken] = useState(localStorage.getItem("token"));
  const [cart, setCart] = useState([]);

  return (
    <AllContext.Provider value={{ cart, setCart, token, setToken }}>
      {" "}
      {/* 使用 CartProvider 包裹整個應用 */}
      <Router>
        <AppBar position="static">
          <Toolbar>
            <Typography variant="h6" mr={2}>
              鐵人賽
            </Typography>
            <NavLinks>
              <ul>
                <li>
                  <Link to="/">首頁</Link>
                </li>
                <li>
                  <Link to={token === "1" ? "/member" : "/login"}>
                    {token === "1" ? "會員" : "登入"}
                  </Link>
                </li>
                <li>
                  <Link to="/product">商品介紹</Link>
                </li>
                <li>
                  <Link to="/cart">購物車</Link>
                </li>
              </ul>
            </NavLinks>
          </Toolbar>
        </AppBar>
        <Container>
          <AppWrapper>
            <Routes>
              <Route path="/" element={<Home />} />
              <Route path="/login" element={<Login />} />
              <Route path="/product" element={<Product />} />
              <Route path="/cart" element={<Cart />} /> {/* 使用 Cart 頁面 */}
              <Route path="/member" element={<Member />} />
            </Routes>
          </AppWrapper>
        </Container>
      </Router>
    </AllContext.Provider>
  );
}

export default App;

咒語:那這樣在 Product 頁面要怎樣使用AllContext

import { AllContext } from "../App";

//略
  const AC = useContext(AllContext);
  const [cart, setCart] = useState([]); //刪除此行
  
 // 把這兩個參數改成全域使用
    const addToCart = (product) => {
    // 添加商品到購物車
    AC.setCart([...AC.cart, product]);
  };

咒語:使用mui挑選適合的元件,建立一個購物車元件 並且把cart 資料引入 可以做顯示刪除 還有結帳按鈕

import React, { useContext } from "react";
import { AllContext } from "../App";
import {
  Table,
  TableBody,
  TableCell,
  TableContainer,
  TableHead,
  TableRow,
  Paper,
  Button,
  IconButton,
} from "@mui/material";
import DeleteIcon from "@mui/icons-material/Delete";

function Cart() {
  const { cart, setCart } = useContext(AllContext);

  const removeFromCart = (productId) => {
    console.log(productId, "productId");
    // 根據商品 ID 刪除購物車中的商品
    const updatedCart = cart.filter((product) => product.id !== productId);
    setCart(updatedCart);
  };

  const checkout = () => {
    // 在此處執行結帳邏輯
    alert("結帳成功!感謝您的購買。");
    setCart([]); // 清空購物車
  };

  return (
    <div>
      <h2>購物車</h2>
      <TableContainer component={Paper}>
        <Table>
          <TableHead>
            <TableRow>
              <TableCell>商品名稱</TableCell>
              <TableCell>價格</TableCell>
              <TableCell>操作</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {cart.map((product, index) => (
              <TableRow key={index}>
                <TableCell>{product.title}</TableCell>
                <TableCell>${product.price}</TableCell>
                <TableCell>
                  <IconButton
                    aria-label="刪除"
                    onClick={() => removeFromCart(product.id)}
                  >
                    <DeleteIcon />
                  </IconButton>
                </TableCell>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>
      <Button variant="contained" color="primary" onClick={checkout}>
        結帳
      </Button>
    </div>
  );
}

export default Cart;

刪除點下去 發現會發生錯誤

查看原始資料 少了個id
找到產品頁面

  const generateFakeProducts = (count) => {
    const products = [];
    for (let i = 0; i < count; i++) {
      const productName = `商品${i + 1}`;
      const price = Math.floor(Math.random() * 1000);
      const product = {
        image: `https://picsum.photos/200/200?random=${i}`,
        title: productName,
        price: `$${price}`,
        id: i,// 這裡加上id
      };
      products.push(product);
    }
    return products;
  };

這樣子簡易的購物車清單就做完了


上一篇
[Day14] Table 文章結構
下一篇
[Day16] 人總是要聊天的 留個言吧
系列文
I have an AI ,I have a React, Ugh ,AI -React 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言